モダンデータスタック向けの機械学習プラットフォーム「Continual」を使ってみた
大阪オフィスの玉井です。
今回は「Continual」という機械学習系のSaaSを使ってみます。
Continualとは
データウェアハウス(DWH)上で動作する機械学習系サービス
公式ドキュメントには、下記のように書かれています。
Continual is an operational AI/ML platform for cloud data warehouses.
ここ最近、機械学習系のSaaSがちょこちょこ出始めています。Continualも、それに属するサービスの1つだと思います。しかし、Continualには、他のサービスには無い、最大の特徴があります。
- 機械学習モデルを作成するためのデータは全てデータウェアハウス上のデータを対象とする
- 作成した機械学習モデルの予測結果等も全てデータウェアハウスに出力する
機械学習を手軽に行えるという点では、他にも色々なサービスがあるかと思いますが、機械学習を行うにあたり、データの入出力は全てDWHで完結する、というのは、他にはなかなかないんじゃないでしょうか。個人的な観測範囲では、S3等のバケットに吐き出したデータを対象にするサービスがほとんどな気がします。
予測結果もDWHに(テーブルやビューとして)保存されるため、後続の活用(BIツールで可視化、他ツールに連携など)もスムーズです。
DWHにたまり続けるデータを活用して、常に最適な機械学習モデルを運用し続けることができます。
モダンデータスタック(MDS)に最適
ここ最近、データ分析基盤の傾向として、モダンデータスタック(MDS)という概念が広まり始めています。MDSの特徴して「データのあらゆる処理を全てDWHで行う」というものがあります。最近のDWHはどれも高性能なので、データのロード、変換、可視化、あらゆる処理をSQLとしてDWH上で行おうという考え方です。
MDSを推進していくと、あらゆるデータが自ずとDWHに集約されてきます。Continualはそこにすごく導入しやすいサービスとなっています。なぜなら、前述の通り、DWHとネイティブに接続するサービスだからです。
注意
2022年1月現在、パブリックベータです。
やってみた
やることの概要
Quick Startというチュートリアルがあるのですが、今回はそちらではなく、Lead scoringというサンプルプロジェクトの方をやってみます。
ざっくりいえば「Kaggleにある課題をContinualでやってみる」的な内容になっています。
課題の内容を簡単にいうと、「コンバージョン(購買とか)につながるリード(見込み客)を予測せよ」です。営業チームからすれば、予め優良顧客になりそうなリードがわかれば、営業リソースの割り振り効率が良くなるので、願ったり叶ったりですね。
つまり、下記のようなことをやってみます。
- 「リード(見込み客)に対応した結果のデータ」を学習して…
- 「そのリードが優良顧客になりそうかどうか」を予測する(機械学習モデルを作成する)
無料トライアルに申し込み
上記コーポレートサイトの右上より、フリートライアルを開始します。
メールアドレスとパスワードを入力してサインアップすると、メールアドレスに、Continualにログインするためのリンクが送られてきます(普通のSaaSと同じ流れです)。
Projectを作成する
Continualにログインして最初にやることは、Projectの作成です。Continualにおける最上位の概念であり、データウェアハウスの接続とか、機械学習モデルの作成とか、あらゆる作業のワークスペースの単位になります。これも、SaaSでよくある概念ですね。
ログインすると、Projectを作れって言われます。
Project名を入れて、Projectを作成します。
データウェアハウスを接続する
Projectに対して、DWHを設定します。記事冒頭で説明したように、Continualは、処理の対象全てがDWHのデータになるため、DWHの設定は必須です。
ドキュメントのチュートリアルではSnowflakeが使われていたので、あえて今回はBigQueryを設定してみます。
BigQuery側の設定
ContinualとBQを接続するためには、BQ側で多少の設定が必要です。
まずは、Continual用のサービスアカウントを作成します。「BigQueryユーザー」のロールを付与しておいてください。後で、サービスアカウントのキーファイル(Json)が必要になるので、ここでダウンロードしておきましょう。
次に、Continual用のデータセットを作成します。学習用のデータを配置するのはここになります。また、Continualが機械学習モデルを回して予測した結果なんかも、このデータセット下に格納されます。
作成したデータセットに、先程作成したサービスアカウントがアクセスできるようにします。「共有」→「権限」→「プリンシパルを追加」で、サービスアカウントを指定します。付与するロールは「BigQuery管理者」です。
Continual側の設定
上記が一通り設定できたら、Continualに戻って、各種設定を入力します。注意点なのですが、私が試した限り、ここで入力する文字は全て小文字じゃないとエラーになりました(だから、データセット名に大文字を入れてると詰む…)。
問題なければ、テスト接続が完了します。
機械学習モデルを作成する
さて、ついに機械学習モデルを作成します。
本来、機械学習モデルを作成するとなると、かなーり大変です。課題をしっかり把握して(分類なのか予測なのか回帰なのか等)、それに一番合ったアルゴリズムを調査して(予測→決定木、ロジスティック回帰、SVMなど)、そのアルゴリズムのハイパーパラメータなんかを調整して、一番予測成果の高いモデルを探求していきます。
Continualの場合、ここらへんの作業は全部自動でやってくれます。バリバリのデータサイエンティストには物足りませんが、そうでないユーザーにとっては非常にありがたいです。
Continual CLIをインストールする
全てWeb UIで作業することもできますが、CLIの方が楽なこともあるので、勉強も兼ねて、ここから少しだけコマンドで操作していきます。
下記コマンドで、Continual CLIをインストールします(要Python 3.8以上)。私は3.9.9で実施したところ、Warningがやたら出ましたが、普通に使える状態にはなりました(これはいいのか駄目なのかは不明)。
$ pip3 install continual
CLI上でContinualにログインする
下記でログインします。ログイン情報を聞かれるので、メールアドレスとパスワードを入力します。その後、どのProjectで作業するのか聞かれるので、先程作成したProject(の番号)を入れます。
$ continual login Email: [email protected] Password: Select default project: [1]: cm-tamai-test (cm_tamai_test) Choice: ## 選びたいProjectの番号を入れる
学習用データをDWHにロードする
Continual CLIを通じて、DWHにcsvファイルをロードすることができます。本番環境では使わないと思いますが、ちょっとテスト的に使用する分には便利な機能ですね。
上記のKaggleページからcsvファイルをダウンロードして、下記コマンドを実行します(私の場合、カラム名にアンスコが入っているとエラーでロードできませんでした…。面倒だったら別の手段でロードしても良いと思います)。
$ continual projects seed Lead\ Scoring.csv
設定したDWHのContinual用データセット下に、csvデータがロードされます。
モデル定義のyamlファイルを作成する
いよいよ、作成するモデルの設定をしていきます。本来は、Feature Set
やEntity
といった概念を作成して、学習用データとモデルと予測結果を別々に使っていくのが本道のようなのですが、今回のサンプルプロジェクトでは「学習用データだけ使ってとりあえず予測までやってみる」っていうお試しレベルのため、Model
という概念だけ作成します(スタンドアローンモデルと呼称するようです)。
というわけで、下記を作成します。
type: Model name: lead_converted description: オンラインコースのユーザーインタラクション index: prospectid target: converted columns: - type: BOOLEAN name: converted query: > select * from `tamai-rei.featurestore.Lead_Scoring`
上記の通り、Continualは、作成したい機械学習モデルをyamlファイルで定義します(ちなみに、このファイルのほとんども全て小文字で入力しないとエラーになりました)。
色々なパラメータを設定できますが、重要なのは下記2項目です。
index
- そのデータを一意に判別できるカラムを指定する(要するに主キー)
target
- 予測したいカラムを指定する
今回は「コンバージョンするかしないか」を予測したいので、target
にはconverted
を指定します。
query
は、対象となるデータをとってくるクエリを記述します。今回は全データを対象にするので、Select * From〜
のシンプルなクエリになっています。
yamlファイルをアップロードする
作成したいモデルを定義できたら、それをContinualにアップロードします。
$ continual push lead_scoring_model.yaml Pushing path(s) ['lead_scoring_model.yaml'] into Continual Updating (lead_scoring_example_3@prod): Pushing path(s) ['lead_scoring_model.yaml'] from CLI. Operations for c7kfjsth5rrdmbr07go0 in project lead_scoring_example_3, environment prod: Operation State Model: lead_converted CREATE PENDING PROFILE PENDING TRAIN PENDING PROMOTE PENDING PREDICT PENDING Link: https://cloud.continual.ai/projects/lead_scoring_example_3/changes/xxxxxxxxxx
上記コマンドを実行した時点で、モデルの作成→学習→予測まで、一気に回ります。
Modelの各種結果(学習や予測など)を確認する
上記で実行したジョブは、Web UIで確認することができます。
左側メニューのChanges
から、実行中(後)のジョブを確認できます。
ジョブを選択すると、モデル作成の各過程の状態がわかるようになっています。
例えば、TRAINの詳細を見ると、試されたアルゴリズムの一覧と成績がわかります。Continualが自動で色々試して、一番成績のいいアルゴリズムを選定してくれているのがわかりますね。今回はLightGBMが選ばれたようです。
作成されたモデル自体の成果も確認できます。混同行列、適合率、再現率、F値など、モデルの基本的な評価指標がわかりますね。また、下部には、Feature Importanceがあります。
PREDICTでは、予測結果の詳細を見ることができます。今回は学習用データだけでやってるので、「学習用データに対して、今回のモデルで予測してみた」という結果になっています。
データの各種分布を確認できます。
肝心の予測結果ですが、DWHに格納されます。ですので、これをBIツールで可視化したり、他ツールに連携するのが、容易になっています。
上記のクエリをDWHで実行すると、予測結果がわかります。
以上、簡単操作で、優良顧客を判別する機械学習モデルを作成することができました。
できるっぽいけど未確認な事項
データの分割
本来は、学習データ、検証データ、テストデータなど、それぞれ別にあるはずです。これらをContinualで実現するためには、Feature SetとEntityという概念を理解しないといけないですね。
Modelの自動実行
本番環境であれば、各種データは、日々新しいレコードが追加され続けるはずです。
それらに対して、学習と予測を定期的に実行し続ける機能があるようです(アルゴリズムも都度一番いい成績のものに変わる)。それも試せたらいいなと思っています。
dbtとの連携
機械学習系のサービスでは珍しいdbtとの連携機能があるようです。チュートリアルもあるので、試しやすそう。
おわりに
モダンデータスタックにも、ついに機械学習の波が到来してきましたね。